<?php

namespace Admin\Model;
use Think\Model;

class AddonsModel extends Model {

    /**
     * 查找后置操作
     */
    protected function _after_find(&$result,$options) {

    }

    protected function _after_select(&$result,$options){

        foreach($result as &$record){
            $this->_after_find($record,$options);
        }
    }
    /**
     * 文件模型自动完成
     * @var array
     */
    protected $_auto = array(
        array('create_time', NOW_TIME, self::MODEL_INSERT),
    );

    /**
     * 获取插件列表
     * @param string $addon_dir
     */
    public function getList($addon_dir = ''){
		//如果没有插件文件夹参数传递过来，使用APP_ADDON_PATH变量作为插件的路径
        if(!$addon_dir){
            $addon_dir = APP_ADDON_PATH;
		}
		//使用glob函数获取$addon_dir目录下所有的文件名，并且通过array_map方法对返回数组的每个值返回文件名称
        $dirs = array_map('basename',glob($addon_dir.'*', GLOB_ONLYDIR));
        if($dirs === FALSE || !file_exists($addon_dir)){
            $this->error = '插件目录不可读或者不存在';
            return FALSE;
        }
		//设置空变量，作为存储插件信息的变量
		$addons			=	array();
		//设置查询条件,即数据库中插件表的所有记录都应该在插件文件夹中存在，否则不显示记录
		$where['name']	=	array('in',$dirs);
		//获取所有的已安装的插件
		$list			=	$this->where($where)->field(true)->select();
		//对于前面从数据库中获取的插件记录，进行操作
		foreach($list as $addon){
			//卸载状态设置为启用
			$addon['uninstall']		=	0;
			//在前面声明的插件数组中，添加记录，键值为插件的名称，值为这条记录的数据库信息
			$addons[$addon['name']]	=	$addon;
		}
		//循环所有的文件夹内的插件数组
        foreach ($dirs as $value) {
			//对已安装的插件进行判断处理
            if(!isset($addons[$value])){
				//获取当前插件的入口类
				$class = get_addon_class($value);
				//如果不存在此类
				if(!class_exists($class)){
					$addons[$value]['status']=-1;
					//如果实例化失败，记录到乳汁文件中去 
					\Think\Log::record('插件'.$value.'的入口文件不存在！');
					//结束本次循环
					continue;
				}
				//实例化当前类
                $obj    =   new $class;
				//在插件数组中这是当前插件的信息，即实例化类中的配置信息
				$addons[$value]	= $obj->info;
				//设置当前类的配置信息
				if($addons[$value]){
					//卸载状态设置为禁用
					$addons[$value]['uninstall'] = 1;
					//移除默认状态
                    unset($addons[$value]['status']);
				}
			}
        }
		
        $addons = list_sort_by($addons,'uninstall','desc');
        return $addons;
    }

}
